/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.managed;

import sv.com.intesal.compra.controlador.OrdenCompraControlador;
import sv.com.intesal.clases.LimpiarManaged;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.compra.bean.Empresa;
import sv.com.intesal.compra.bean.OrdenCompra;
import sv.com.intesal.compra.bean.SolicitudMaterial;
import sv.com.intesal.compra.controlador.EmpresaControlador;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.RowEditEvent;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.Material;
import sv.com.intesal.compra.bean.Proveedor;
import sv.com.intesal.compra.controlador.ProveedorControlador;
import sv.com.intesal.seguridad.controlador.ParametroFacturacionControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;
import sv.com.intesal.seguridad.managed.SessionManaged;

/**
 *
 * @author andrew
 */
@ManagedBean(name = "ordenCompraManaged")
@ViewScoped
public class OrdenCompraManaged implements Serializable {

    private cVarios v;
    private Mensaje m;
    private SessionManaged sm;
    private Boolean flag_1;
    private Boolean flag_2;

    /*SOLICITUD DE MATERIAL*/

    /*For second table*/
    private List<SolicitudMaterial> listaMaterialesSolicitar;

    /*..........*/
    private Proveedor selectedProveedor;
    private List<Empresa> cmbEmpresa;
    private List<String> cmbTipo;
    /*ORDEN DE COMPRA*/
    private List<OrdenCompra> encaOrdenCompra;
    private OrdenCompra selectedEncaOrdenCompra;
    private OrdenCompra selectedDetaOrdenCompra;
    private OrdenCompra selectedDetaOrdenCompraTotales;

    public OrdenCompraManaged() {

        this.v = new cVarios();
        this.m = new Mensaje();
        this.sm = new SessionManaged();
        this.flag_1 = true;
        this.flag_2 = false;

        /*PROVEEDOR*/
        selectedProveedor = new Proveedor();

        /*ORDEN COMPRA*/
        selectedEncaOrdenCompra = new OrdenCompra();
        selectedDetaOrdenCompra = new OrdenCompra();
        selectedDetaOrdenCompraTotales = new OrdenCompra();

        llenarPagina();
    }

    private void llenarPagina() {
        try {
            if (cmbEmpresa == null) {
                EmpresaControlador ec = new EmpresaControlador();
                cmbEmpresa = ec.fillComboBox();
            }
            if (cmbTipo == null) {
                cVarios v = new cVarios();
                cmbTipo = v.TipoPago();
                this.selectedEncaOrdenCompra.setTipo_oc(cmbTipo.get(0).toString());
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    public void modificarOrdenCompra() {
        try {
            SessionControlador sc = new SessionControlador();
            if (sc.getCodigo_Proceso_Modificar() != 0) {
                OrdenCompraControlador occ = new OrdenCompraControlador();

                this.selectedEncaOrdenCompra = occ.ConsultaOrdenCompraEnca(sc.getCodigo_Proceso_Modificar());
                this.encaOrdenCompra = occ.getDeta_OrdenCompra(this.selectedEncaOrdenCompra.getId_oc());

                ProveedorControlador pc = new ProveedorControlador();
                selectedProveedor = pc.getProveedor(this.selectedEncaOrdenCompra.getId_p());
                sc.setCodigo_Proceso_Modificar(0);

                this.selectedEncaOrdenCompra.setFiltro_percepcion_oc(true);
                if (this.selectedProveedor.getPercepcion_p().equals("N")) {
                    this.selectedEncaOrdenCompra.setFiltro_percepcion_oc(false);
                }
                this.calcularTotales();
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    public void calcularTotales() throws Exception {
        try {

            this.selectedDetaOrdenCompraTotales.setTotal_costo_sd_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_costo_cd_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_iva_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_exento_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_descuento_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_subTotal_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_oc(0.00);
            this.selectedDetaOrdenCompraTotales.setTotal_percepcion_oc(0.00);

            /*
            if there is no material in the grid it shouldn't calculate the totals
             */
            if (this.encaOrdenCompra != null) {
                ParametroFacturacionControlador pf = new ParametroFacturacionControlador();
                for (int i = 0; i < this.encaOrdenCompra.size(); i++) {
                    Double iva = pf.getIva();

                    /*DETALLE DE ORDEN DE COMPRA*/
                    this.encaOrdenCompra.get(i).setExento_d(0.00);
                    this.encaOrdenCompra.get(i).setSubTotal_d(0.00);
                    this.encaOrdenCompra.get(i).setIva_d(0.00);

                    this.encaOrdenCompra.get(i).setDescuento_d(v.AproximarDecimal((this.encaOrdenCompra.get(i).getCosto_sd_d() * this.encaOrdenCompra.get(i).getPorcentaje_descuento_d())));
                    this.encaOrdenCompra.get(i).setCosto_cd_d(v.AproximarDecimal((this.encaOrdenCompra.get(i).getCosto_sd_d() - this.encaOrdenCompra.get(i).getDescuento_d())));
                    if (this.selectedEncaOrdenCompra.getTipo_oc().equals("CCF")) {
                        this.encaOrdenCompra.get(i).setIva_d(v.AproximarDecimal(
                                this.encaOrdenCompra.get(i).getCantidad_d() * this.encaOrdenCompra.get(i).getCosto_cd_d()) * iva);
                    }
                    this.encaOrdenCompra.get(i).setSubTotal_d(v.AproximarDecimal(((this.encaOrdenCompra.get(i).getCantidad_d() * this.encaOrdenCompra.get(i).getCosto_cd_d()) + this.encaOrdenCompra.get(i).getIva_d() + this.encaOrdenCompra.get(i).getExento_d())));

                    /*CALCULAR TOTALES*/
                    /*COSTO S/D*/
                    this.selectedDetaOrdenCompraTotales.setTotal_costo_sd_oc(
                            this.encaOrdenCompra.get(i).getCosto_sd_d()
                            + this.selectedDetaOrdenCompraTotales.getTotal_costo_sd_oc());

                    /*IVA*/
                    this.selectedDetaOrdenCompraTotales.setTotal_iva_oc(
                            this.encaOrdenCompra.get(i).getIva_d()
                            + this.selectedDetaOrdenCompraTotales.getTotal_iva_oc());

                    /*EXENTO*/
                    this.selectedDetaOrdenCompraTotales.setTotal_exento_oc(
                            this.encaOrdenCompra.get(i).getExento_d()
                            + this.selectedDetaOrdenCompraTotales.getTotal_exento_oc());

                    /*DESCUENTO*/
                    this.selectedDetaOrdenCompraTotales.setTotal_descuento_oc(
                            this.encaOrdenCompra.get(i).getDescuento_d()
                            + this.selectedDetaOrdenCompraTotales.getTotal_descuento_oc());

                    /*COSTO C/D*/
                    this.selectedDetaOrdenCompraTotales.setTotal_costo_cd_oc(
                            this.encaOrdenCompra.get(i).getCosto_cd_d()
                            + this.selectedDetaOrdenCompraTotales.getTotal_costo_cd_oc());

                    /*SUB TOTAL*/
                    this.selectedDetaOrdenCompraTotales.setTotal_subTotal_oc(
                            this.encaOrdenCompra.get(i).getSubTotal_d()
                            + this.selectedDetaOrdenCompraTotales.getTotal_subTotal_oc());
                }

                if (this.selectedEncaOrdenCompra.getTipo_oc().equals("CCF")) {
                    if (this.selectedProveedor.getPercepcion_p() != null) {
                        //if (this.selectedProveedor.getPercepcion_p().equals("S")) {
                        if (this.selectedEncaOrdenCompra.getFiltro_percepcion_oc() == true) {
                            if (this.selectedDetaOrdenCompraTotales.getTotal_subTotal_oc() >= pf.getValorPercepcion()) {
                                this.selectedEncaOrdenCompra.setPercepcion_oc(v.AproximarDecimal(this.selectedDetaOrdenCompraTotales.getTotal_subTotal_oc() * pf.getPercepcion()));
                                this.selectedEncaOrdenCompra.setTotal_percepcion_oc(this.selectedEncaOrdenCompra.getPercepcion_oc());

                                this.selectedDetaOrdenCompraTotales.setPercepcion_oc(this.selectedEncaOrdenCompra.getPercepcion_oc());
                                this.selectedDetaOrdenCompraTotales.setTotal_percepcion_oc(this.selectedEncaOrdenCompra.getPercepcion_oc());

                            }
                        }
                    }
                }

                this.selectedDetaOrdenCompraTotales.setTotal_oc(
                        v.AproximarDecimal(this.selectedDetaOrdenCompraTotales.getTotal_subTotal_oc()
                        + this.selectedEncaOrdenCompra.getPercepcion_oc()));

            }

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void getMaterial_Quick(Material ma) {
        try {
            if (ma != null) {
                List<OrdenCompra> lista = new ArrayList<OrdenCompra>();
                if (this.encaOrdenCompra != null) {
                    lista = this.encaOrdenCompra;
                }

                OrdenCompra oc = new OrdenCompra();
                oc.setId_d(0);
                oc.setExento_d(0.00);
                oc.setIva_d(0.00);
                oc.setPorcentaje_descuento_d(0.00);
                oc.setDescuento_d(0.00);
                oc.setSubTotal_d(0.00);

                oc.setCosto_sd_d(ma.getCosto_dm());
                oc.setCosto_cd_d(ma.getCosto_dm());
                oc.setNombre_m(ma.getNombre_m());
                oc.setId_dm(ma.getId_dm());
                oc.setCantidad_d(0.0);

                lista.add(oc);
                this.encaOrdenCompra = lista;
                this.calcularTotales();
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    public void eliminarRegistro() {
        try {
            if (this.selectedDetaOrdenCompra == null) {
                m.messageError("DEBE ELEGIR UN REGISTRO PARA CONTINUAR");
            } else if (selectedDetaOrdenCompra.getId_d() == 0) {
                this.encaOrdenCompra.remove(this.selectedDetaOrdenCompra);

                /*falta incorporarlo la de solicitud*/
                m.messageInfo(m.getIeliminada());
            } else {
                if (sm.validar_rol_usuario("wfrmOrdenCompra", sm.eliminar) == true) {
                    OrdenCompraControlador oc = new OrdenCompraControlador();

                    this.selectedDetaOrdenCompra.setNumero_oc(this.selectedEncaOrdenCompra.getNumero_oc());
                    oc.eliminarItem(this.selectedDetaOrdenCompra);
                    this.encaOrdenCompra.remove(this.selectedDetaOrdenCompra);
                }
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    public void completeTransaction() {
        try {
            if (this.validarOrdenCompra() == true) {

                if (this.selectedEncaOrdenCompra.getId_oc() == null) {
                    if (sm.validar_rol_usuario("wfrmOrdenCompra", sm.agregar) == true) {
                        this.selectedEncaOrdenCompra.setId_p(selectedProveedor.getId_p());
                        OrdenCompraControlador occ = new OrdenCompraControlador();
                        occ.setEnca(this.selectedEncaOrdenCompra, encaOrdenCompra);
                        LimpiarManaged.limpiar();
                    }
                } else {
                    if (sm.validar_rol_usuario("wfrmOrdenCompra", sm.modificar) == true) {
                        this.selectedEncaOrdenCompra.setId_p(selectedProveedor.getId_p());
                        OrdenCompraControlador occ = new OrdenCompraControlador();
                        occ.setEnca(this.selectedEncaOrdenCompra, encaOrdenCompra);
                        LimpiarManaged.limpiar();
                    }
                }
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    private boolean validarOrdenCompra() throws Exception {
        try {
            Boolean var_return = true;


            if (this.selectedEncaOrdenCompra.getTipo_oc().equals("--")) {
                m.messageAdvertencia("Seleccionar un Tipo Válido");
                var_return = false;
            }

            if (this.encaOrdenCompra == null) {
                m.messageAdvertencia("No hay materiales para realizar la Orden de Compra");
                var_return = false;
            } else if (this.encaOrdenCompra.size() <= 0) {
                m.messageAdvertencia("No hay materiales para realizar la Orden de Compra");
                var_return = false;
            }

            if (this.selectedEncaOrdenCompra.getId_em() == null) {
                m.messageAdvertencia(m.campoError("EMPRESA"));
                var_return = false;
            }
            if (this.selectedEncaOrdenCompra.getFecha_oc() == null) {
                m.messageAdvertencia(m.campoError("FECHA"));
                var_return = false;
            }

            if (this.selectedProveedor.getNombre_p() == null) {
                m.messageAdvertencia(m.campoError("PROVEEDOR"));
                var_return = false;
            }



            if (var_return == true) {
                for (int i = 0; i < this.encaOrdenCompra.size(); i++) {
                    if (encaOrdenCompra.get(i).getCosto_sd_d() <= 0.00 || encaOrdenCompra.get(i).getCantidad_d() == 0.00) {
                        m.messageAdvertencia("Hay DATOS QUE NO SON VALIDOS EN EL GRID");
                        var_return = false;
                        break;
                    }
                }
            }


            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void getProveedor_Quick(Proveedor pr) {
        try {
            this.selectedProveedor = pr;
            this.selectedEncaOrdenCompra.setFiltro_percepcion_oc(false);
            if (this.selectedProveedor.getId_p() != null) {
                if (this.selectedProveedor.getPercepcion_p().equals("S")) {
                    this.selectedEncaOrdenCompra.setFiltro_percepcion_oc(true);
                }
            }
            this.calcularTotales();
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void onEditRow(RowEditEvent event) {
        try {
            this.calcularTotales();
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    /*
     *Setters & Getters
     */
    public List<Empresa> getCmbEmpresa() {
        return cmbEmpresa;
    }

    public void setCmbEmpresa(List<Empresa> cmbEmpresa) {
        this.cmbEmpresa = cmbEmpresa;
    }

    public Proveedor getSelectedProveedor() {
        if (selectedProveedor == null) {
            selectedProveedor = new Proveedor();
        }
        return selectedProveedor;
    }

    public void setSelectedProveedor(Proveedor selectedProveedor) {
        this.selectedProveedor = selectedProveedor;
    }

    public List<String> getCmbTipo() {
        return cmbTipo;
    }

    public void setCmbTipo(List<String> cmbTipo) {
        this.cmbTipo = cmbTipo;
    }

    public OrdenCompra getSelectedDetaOrdenCompraTotales() {
        if (selectedDetaOrdenCompraTotales == null) {
            selectedDetaOrdenCompraTotales = new OrdenCompra();
        }
        return selectedDetaOrdenCompraTotales;
    }

    public void setSelectedDetaOrdenCompraTotales(OrdenCompra selectedDetaOrdenCompraTotales) {
        this.selectedDetaOrdenCompraTotales = selectedDetaOrdenCompraTotales;
    }

    public OrdenCompra getSelectedDetaOrdenCompra() {
        if (selectedDetaOrdenCompra == null) {
            selectedDetaOrdenCompra = new OrdenCompra();
        }
        return selectedDetaOrdenCompra;
    }

    public void setSelectedDetaOrdenCompra(OrdenCompra selectedDetaOrdenCompra) {
        this.selectedDetaOrdenCompra = selectedDetaOrdenCompra;
    }

    public OrdenCompra getSelectedEncaOrdenCompra() {
        if (selectedEncaOrdenCompra == null) {
            selectedEncaOrdenCompra = new OrdenCompra();
        }
        return selectedEncaOrdenCompra;
    }

    public void setSelectedEncaOrdenCompra(OrdenCompra selectedEncaOrdenCompra) {
        this.selectedEncaOrdenCompra = selectedEncaOrdenCompra;
    }

    public Boolean getFlag_1() {
        return flag_1;
    }

    public void setFlag_1(Boolean flag_1) {
        this.flag_1 = flag_1;
    }

    public Boolean getFlag_2() {
        return flag_2;
    }

    public void setFlag_2(Boolean flag_2) {
        this.flag_2 = flag_2;
    }

    public List<OrdenCompra> getEncaOrdenCompra() {
        return encaOrdenCompra;
    }

    public void setEncaOrdenCompra(List<OrdenCompra> encaOrdenCompra) {
        this.encaOrdenCompra = encaOrdenCompra;
    }

    public List<SolicitudMaterial> getListaMaterialesSolicitar() {
        return listaMaterialesSolicitar;
    }

    public void setListaMaterialesSolicitar(List<SolicitudMaterial> listaMaterialesSolicitar) {
        this.listaMaterialesSolicitar = listaMaterialesSolicitar;
    }
}
